/*
 * 线程安全问题
 * */
public class Demo9 {
    public static int count;
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count++;
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count++;
            }
        });

        t1.start();
        t2.start();

        // 阻塞主线程,防止上面两个线程还没执行结束,就执行到打印语句
        t1.join();
        t2.join();

        // 预期结果 10W  实际结果并不是10W 并且每次运行得到的结果并不相同
        System.out.println("count:"+count);

        /*
        * 站在cpu的角度来看count++ 是通过三个指令来完成的
        * load: 把数据从内存读取到cpu寄存器中
        * add: 将寄存器中的数据加一
        * save: 将寄存器中的数据,保存到内存中
        *
        * 在一个线程进行load操作后还没有来得及执行save操作时,另一个线程进行了load操作
        * 导致出现bug
        * 排列组合情况非常复杂
        * */
    }
}
